package ar.edu.utn.frsf.tpae.a2014.g01.entidad;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "ped")
public class Pedido {

        @Id
        @Column(name = "ped_id")
        @SequenceGenerator(name = "seq_ped", sequenceName = "seq_ped", allocationSize = 1)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_ped")
        private int id;
        
        @Column(name = "ped_dir_org")
        private String origen;
        
        @Column(name = "ped_dir_dst")
        private String destino;
        
        @Column(name = "ped_dsc")
        private String articulo;
        
        @Column( name = "ped_pso")
        private float peso;
        
        @Column( name = "ped_vol")
        private float volumen;
        
        @ManyToOne
        @JoinColumn(name="ped_cli_id")
        private Cliente cliente;

        @ManyToOne
        @JoinColumn(name="ped_adm_id")
        private Administrador administrador;

		@ManyToOne
        @JoinColumn(name="ped_tra_id")
        private Transportista transportista;
 
        @OneToMany(mappedBy="pedido",fetch = FetchType.EAGER)
        @Cascade({CascadeType.SAVE_UPDATE})
        private List<HistorialPedido> historiales;	
	
        public Pedido(){
        	if(this.historiales==null) this.historiales = new ArrayList <HistorialPedido>();
        	HistorialPedido hist = new HistorialPedido(0,Estado.ACEPTADO,new Date(),new Date(),"");
        	hist.setPedido(this);
    		this.historiales.add(hist);
		
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getOrigen() {
		return origen;
	}
	public void setOrigen(String origen) {
		this.origen = origen;
	}
	public String getDestino() {
		return destino;
	}
	public void setDestino(String destino) {
		this.destino = destino;
	}
	public String getArticulo() {
		return articulo;
	}
	public void setArticulo(String articulo) {
		this.articulo = articulo;
	}
	public float getPeso() {
		return peso;
	}
	public void setPeso(float peso) {
		this.peso = peso;
	}
	public float getVolumen() {
		return volumen;
	}
	public void setVolumen(float volumen) {
		this.volumen = volumen;
	}
	public List<HistorialPedido> getHistoriales() {
		return historiales;
	}
	public void setHistoriales(List<HistorialPedido> historiales) {
		this.historiales = historiales;
	}
	
	public List<HistorialPedido> addHistoriales(HistorialPedido h1) {
		this.historiales.add(h1);
		return historiales;
	}

	
	public Pedido(int id, String origen, String destino, String articulo,
			float peso, float volumen, String comentario,
			List<HistorialPedido> historiales) {
		this.id = id;
		this.origen = origen;
		this.destino = destino;
		this.articulo = articulo;
		this.peso = peso;
		this.volumen = volumen;
		this.historiales = historiales;
		if(this.historiales==null) this.historiales = new ArrayList <HistorialPedido>(); 
    	HistorialPedido hist = new HistorialPedido(0,Estado.ACEPTADO,new Date(),new Date(),comentario);
    	hist.setPedido(this);
		this.historiales.add(hist);

	}
	@Override
	public String toString() {
		return "Pedido [id=" + id + ", origen=" + origen + ", destino="
				+ destino + ", articulo=" + articulo + ", peso=" + peso
				+ ", volumen=" + volumen + "]";
	}
	public Transportista getTransportista() {
		return transportista;
	}
	public void setTransportista(Transportista transportista) {
		this.transportista = transportista;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
    public Administrador getAdministrador() {
		return administrador;
	}

	public void setAdministrador(Administrador administrador) {
		this.administrador = administrador;
	}
	
	public String getEstado(){
		int maxId=0, i=0, indice=0;
		for(HistorialPedido hist : historiales){
			if(hist.getId()>maxId) {
				indice=i;
				maxId=hist.getId();
			}
			i++;
		}
		switch(this.historiales.get(indice).getEstado()){
		case A_RETIRAR:
			return "A retirar";
		case ACEPTADO:
			return "Aceptado";
		case EN_TRANSPORTE:
			return "En transporte";
		case ENTREGADO:
			return "Entregado";
		default:
			return null;
		}
	}
	
	public String getFechaHoraCreacion(){
		int minId=historiales.get(0).getId(), i=0, indice=0;
		for(HistorialPedido hist : historiales){
			if(hist.getId()<minId) {
				indice=i;
				minId=hist.getId();
			}
			i++;
		}
		return this.historiales.get(indice).getFechaCambioEstado().toLocaleString();
	}
	public String getFechaHoraEntrega(){
		int indice=0;
		if(this.getEstado().equals("Entregado")){
			int maxId=historiales.get(0).getId(), i=0;
			for(HistorialPedido hist : historiales){
				if(hist.getId()>maxId) {
					indice=i;
					maxId=hist.getId();
				}
				i++;
			}
			return this.historiales.get(indice).getFechaCambioEstado().toLocaleString();
		}
		return "NO HA SIDO ENTREGADO";
	}

}
